// package com.tomato.account.algorithm;
//
// import
// org.apache.shardingsphere.sharding.api.sharding.complex.ComplexKeysShardingAlgorithm;
// import
// org.apache.shardingsphere.sharding.api.sharding.complex.ComplexKeysShardingValue;
//
// import java.util.*;
// import java.util.stream.Collectors;
//
/// **
// * 自定义分库分表算法
// * 时间 + 数量 分表
// * 冷热数据
// * 其实还有个即无需数据迁移，又能解决热点问题的解决方案，就是按分组做均衡，结合 range 和 hash mod.
// * 目前处理 = 和 in 操作，其余的操作，比如 >、< 等不支持。
// * @author lizhifu
// * @since 2023/1/1
// */
// public class AccountHisCustomShardingAlgorithm implements
// ComplexKeysShardingAlgorithm<String> {
// /**
// * 账户编号
// */
// private static final String COLUMN_ACCOUNT_NO = "account_no";
// /**
// * 商户编号
// */
// private static final String COLUMN_MERCHANT_NO = "merchant_no";
// /** 配置值需要储存 */
// private Properties props;
// @Override
// public Collection<String> doSharding(Collection<String> collection,
// ComplexKeysShardingValue<String> complexKeysShardingValue) {
// if (!complexKeysShardingValue.getColumnNameAndRangeValuesMap().isEmpty()) {
// throw new RuntimeException("不支持除了=和in的操作");
// }
// // 账户编号
// Collection<String> accountNos =
// complexKeysShardingValue.getColumnNameAndShardingValuesMap().getOrDefault(COLUMN_ACCOUNT_NO,
// new ArrayList<>(1));
// // 商户编号
// Collection<String> merchantNos =
// complexKeysShardingValue.getColumnNameAndShardingValuesMap().getOrDefault(COLUMN_MERCHANT_NO,
// new ArrayList<>(1));
// // 整合账户编号、商户编号
// List<String> ids = new ArrayList<>(16);
// ids.addAll(accountNos);
// ids.addAll(merchantNos);
// return ids.stream()
// // 截取后4位
// .map(id -> id.substring(id.length() - 4))
// // 去重
// .distinct()
// // 转换成int
// .map(Integer::valueOf)
// // 对可用的表名求余数，获取到真实的表的后缀
// .map(idSuffix -> idSuffix % collection.size())
// // 转换成string
// .map(String::valueOf)
// // 获取到真实的表
// .map(tableSuffix -> collection.stream().filter(targetName ->
// targetName.endsWith(tableSuffix)).findFirst().orElse(null))
// .filter(Objects::nonNull)
// .collect(Collectors.toList());
// }
// @Override
// public void init(Properties properties) {
// this.props = properties;
// }
// @Override
// public String getType() {
// // 算法类型
// return "ACCOUNT_HIS_CUSTOM_SHARDING";
// }
//
// @Override
// public Properties getProps() {
// return props;
// }
// }
